package br.com.linkcom.sined.geral.dao;

import br.com.linkcom.neo.controller.crud.FiltroListagem;
import br.com.linkcom.neo.persistence.DefaultOrderBy;
import br.com.linkcom.neo.persistence.QueryBuilder;
import br.com.linkcom.neo.persistence.SaveOrUpdateStrategy;
import br.com.linkcom.sined.geral.bean.Usuario;
import br.com.linkcom.sined.geral.service.UsuariopapelService;
import br.com.linkcom.sined.util.SinedUtil;
import br.com.linkcom.sined.util.neo.persistence.GenericDAO;

@DefaultOrderBy("usuario.nome")
public class UsuarioDAO extends GenericDAO<Usuario> {
	
	private UsuariopapelService usuariopapelService;
	
	public void setUsuariopapelService(UsuariopapelService usuariopapelService) {
		this.usuariopapelService = usuariopapelService;
	}
	
	@Override
	public void updateListagemQuery(QueryBuilder<Usuario> query, FiltroListagem _filtro) {
		if (!usuariopapelService.isAdmin()){
			query.where("usuario=?", SinedUtil.getUsuarioLogado());
		}
	}
	
	@Override
	public void updateEntradaQuery(QueryBuilder<Usuario> query) {
		query.leftOuterJoinFetch("usuario.listaUsuariofilme listaUsuariofilme");
		query.leftOuterJoinFetch("listaUsuariofilme.filme filme");
		query.leftOuterJoinFetch("usuario.listaUsuarioator listaUsuarioator");
		query.leftOuterJoinFetch("listaUsuarioator.ator ator");
		query.leftOuterJoinFetch("usuario.listaUsuariogenero listaUsuariogenero");
		query.orderBy("listaUsuariofilme.nota, filme.titulo, ator.nome");
	}
	
	@Override
	public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
		save.saveOrUpdateManaged("listaUsuariofilme");
		save.saveOrUpdateManaged("listaUsuarioator");
		save.saveOrUpdateManaged("listaUsuariogenero");
	}
	
	public Usuario loadForRecomendarFilme(Usuario usuario){
		return query()
				.leftOuterJoinFetch("usuario.listaUsuariofilme listaUsuariofilme")
				.leftOuterJoinFetch("listaUsuariofilme.filme filme")
				.leftOuterJoinFetch("usuario.listaUsuarioator listaUsuarioator")
				.leftOuterJoinFetch("listaUsuarioator.ator ator")
				.leftOuterJoinFetch("usuario.listaUsuariogenero listaUsuariogenero")
				.where("usuario=?", usuario)
				.unique();
	}
}